# -*- coding: utf-8 -*-
+##############################################################################
+#
+# cyclofficine_ivry module for OpenERP, Custom module for La Cyclofficine
+# de ivry
-import cyclofficine_ivry
+# Copyright (C) 2019 cyclofficine_ivry
+# (<http://cyclocoop.org/index.php/les-ateliers/ivry-sur-seine/>)
+#
+# This file is a part of cyclofficine_ivry
+#
+# cyclofficine_ivry is free software: you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as published
+# by the Free Software Foundation, either version 3 of the License, or (at
+# your option) any later version.
+#
+# cyclofficine_ivry is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
# -*- coding: utf-8 -*-
+##############################################################################
+#
+# cyclofficine_ivry module for OpenERP, Custom module for La Cyclofficine
+# d'Ivry
+#
+# Copyright (C) 2019 cyclofficine_ivry
+# (<http://cyclocoop.org/index.php/les-ateliers/ivry-sur-seine/>)
+#
+# This file is a part of cyclofficine_ivry
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
{
- 'name': 'Cyclofficine Ivry',
- 'version': '2013.10.25',
- 'category': 'Association',
- 'complexity': "normal",
- 'description': """
-Cyclofficine Ivry
-=================
+ 'name': 'Custom Cyclofficine d\'Ivry',
+ 'version': '0.1',
+ 'category': 'Association',
+ 'complexity': "normal",
+ 'description': """
+This module is a profile module for Cyclofficine d'Ivry
+=======================================================
+It installs the profile for bike co-ops to manage some features like:
+ * search customers by member identifier and membership informations in customers views;
+ * import initial datas;
+ * …
""",
- 'author': 'Cyclofficine',
- 'website': 'http://cyclocoop.org',
- 'depends': [
- 'bikecoop',
- 'bikecoop_l10n_fr',
- 'remembership',
- ],
- 'update_xml': [
- 'data/partner.xml',
- 'data/base.xml',
- 'data/product.xml',
- 'data/membership.xml',
- 'data/members.xml',
- 'view/members.xml',
- ],
- 'installable': True,
- 'auto_install': False,
- 'images': [],
+ 'author': 'La Cyclofficine d\'Ivry',
+ 'website': 'http://cyclocoop.org/index.php/les-ateliers/ivry-sur-seine',
+ 'depends': [
+ 'account_cancel',
+ 'bikecoop',
+ 'bikecoop_l10n_fr',
+ 'nrt_point_of_sale',
+ ],
+ 'init_xml': [
+ ],
+ 'update_xml': [
+ 'data/base.xml',
+ 'data/products_categories.xml',
+ 'data/products_products.xml',
+ 'sec/data/members.xml',
+ 'sec/data/users.xml',
+ 'view/members.xml',
+ ],
+ 'installable': True,
+ 'auto_install': False,
+ 'images': [],
}
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
+++ /dev/null
-# -*- coding: utf-8 -*-
-
-from openerp.osv import osv
-from openerp.osv import fields
-import netsvc
-
-
-class Partner(osv.osv):
- _inherit = 'res.partner'
- _order = 'member_ident'
- _columns = {
- 'member_ident': fields.integer('Member identifier'),
- }
-
-Partner()
-
-class account_invoice(osv.osv):
- _inherit = 'account.invoice'
- def draft2open(self, cr, uid, ids):
- print ("DEV: [account_invoice] [draft2open]: %s" % str([uid, ids]))
- wf_service = netsvc.LocalService("workflow")
- wf_service.trg_validate(uid, 'account.invoice', ids[0], 'invoice_open', cr)
- return ids
-
-account_invoice()
+<?xml version="1.0" encoding="UTF-8"?>
<openerp>
- <data>
- <record id="base.main_partner" model="res.partner">
- <field name="category_id" eval="[(6, 0, [ref('res_partner_category_bike_workshop')])]" />
- <field name="city">PARIS</field>
- <field name="email">ivry@cyclocoop.org</field>
- <field name="is_company">True</field>
- <field name="name">Cyclofficine d'Ivry</field>
- <field name="phone">(+33)</field>
- <field name="street">6, bd de Brandebourg</field>
- <field name="street2"></field>
- <field name="type">default</field>
- <field name="website">http://cyclocoop.org</field>
- <field name="zip">94200</field>
- <field search="[('name','=','France')]" model="res.country" name="country_id" />
- </record>
- <record id="base.main_company" model="res.company">
- <field name="currency_id" ref="base.EUR"/>
- <field name="name">Cyclofficine d'Ivry</field>
- <field name="partner_id" ref="base.main_partner"/>
- <field name="rml_footer"></field>
- <field name="rml_header1">Atelier vélo coopératif</field>
- </record>
- </data>
- </openerp>
+ <data>
+ <record id="base.main_partner" model="res.partner">
+ <field name="name">La Cyclofficine d'Ivry</field>
+ <field name="website">cyclocoop.org</field>
+ <field name="street">6 boulevard Brandebourg</field>
+ <field name="street2"></field>
+ <field name="zip">94200</field>
+ <field name="city">IVRY-SUR-SEINE</field>
+ <field name="phone">09 72 38 67 65</field>
+ <field name="mobile">06 48 89 89 21</field>
+ <field name="fax"></field>
+ <field name="email">ivry@cyclocoop.org</field>
+ <field model="res.country" name="country_id" ref="base.fr"/>
+ </record>
+
+ <record id="base.main_company" model="res.company">
+ <field name="name">La Cyclofficine d'Ivry</field>
+ <field name="partner_id" ref="base.main_partner"/>
+ <field name="rml_header1"></field>
+ <field name="siret">531975290 000 36</field>
+ <field name="ape">9499Z</field>
+ <field name="rml_header1">La Cyclofficine c'est ma coopine!</field>
+ <field name="rml_footer">N° SIRET : 531975290 000 36 - Code NAF : 9499Z</field>
+ <field name="currency_id" ref="base.EUR"/>
+ </record>
+
+
+ <record id="base.res_bank_1" model="res.bank">
+ <field name="name">Crédit coopératif Paris Alesia</field>
+ <field name="rib_code">42559</field>
+ <field name="bic">CCOPFRPPXXX</field>
+ <field name="street">99 rue de la Tombe-Issoire</field>
+ <field name="zip">75014</field>
+ <field name="city">PARIS</field>
+ <field model="res.country" name="country" ref="base.fr"/>
+ </record>
+ <record id="main_partner_bank" model="res.partner.bank">
+ <field name="partner_id" ref="base.main_partner"/>
+ <field name="state">iban</field>
+ <field name="bank_code">42559</field>
+ <field name="office">10000</field>
+ <field name="rib_acc_number">08012912645</field>
+ <field name="acc_number">FR76 4255 9100 0008 0129 1264 506</field>
+ <field name="key">06</field>
+ <field name="footer" eval="True"/>
+ <field name="owner_name">La Cyclofficine d'Ivry</field>
+ <field name="street">6 boulevard Brandebourg</field>
+ <field name="zip">94200</field>
+ <field name="city">IVRY-SUR-SEINE</field>
+ <field name="bank" ref="base.res_bank_1"/>
+ <field name="bank_name">Crédit coopératif Paris Alésia</field>
+ <field name="bank_bic">42559</field>
+ <field model="res.country" name="country_id" ref="base.fr"/>
+ <field name="journal_id" model="account.journal" search="[('code', '=', 'BNK2')]"/>
+ </record>
+
+ <record id="base.main_company" model="res.company">
+ <field name="bank_ids" eval="[(6,0,[ref('main_partner_bank')])]"/>
+ </record>
+ </data>
+</openerp>
+++ /dev/null
-libtext-csv-perl
-libtext-trim-perl
-libxml-generator-perl
+++ /dev/null
-#!/usr/bin/perl
-our $partner = "cyclofficine_ivry";
-
-our $VERSION = '2013.10.27';
-use strict;
-use warnings FATAL => qw(all);
-use utf8;
-use open qw/:std :utf8/;
-require Data::Dumper;
-require Encode;
-require IO::Wrap;
-require Text::CSV;
-#require Text::CSV::Encoded;
-require XML::Generator;
-require Text::Trim;
-
-sub parse_date (@) {
- ($_) = @_;
- my ($jj,$mm,undef,$yy) = ($_ =~ m{^\s*([0-3]?[0-9])\s*/\s*([0-1]?[0-9])\s*/\s*(20)?([0-9][0-9])\s*$});
- return "20$yy-$mm-$jj";
- }
-sub parse_amount (@) {
- my ($_) = @_;
- my %amounts =
- ( "gratuit" => 0
- , "Gratuit" => 0
- , "offert" => 0
- , "Offert" => 0
- , "?" => 0
- );
- $_ = Text::Trim::trim($_);
- if (exists $amounts{$_}) {
- return $amounts{$_};
- }
- else {
- ($_) = ($_ =~ m{^\s*([0-9]+),00\s*€?.$});
- return $_;
- }
- }
-sub parse_payment_mean (@) {
- ($_) = @_;
- my %payment_means =
- ( "Espèces" => "cash"
- , "Offert" => "cash"
- , "Chèque" => "bank"
- );
- $_ = Text::Trim::trim($_);
- return exists $payment_means{$_}
- ? $payment_means{$_}
- : "cash";
- }
-sub parse_discount ($) {
- ($_) = @_;
- my %discounts =
- ( "Chômeur" => "unemployed"
- , "Chmeur" => "unemployed"
- , "Atelier vélo IdF" => "velorution_idf"
- , "Étudiant" => "student"
- , "Etudiant" => "student"
- , "etudiant" => "student"
- , "Retraité" => "retired"
- );
- $_ = Text::Trim::trim($_);
- return exists $discounts{$_}
- ? $discounts{$_}
- : "standard";
- }
-sub parse_gender (@) {
- ($_) = @_;
- my %genders =
- ( "Ass." => "association"
- , "M." => "male"
- , "Mme" => "female"
- , "Mme." => "female"
- );
- $_ = Text::Trim::trim($_);
- return exists $genders{$_}
- ? $genders{$_}
- : undef;
- }
-
-our $last_number = -1;
-our $greatest_number = -1;
-sub member_of_csv_line (@) {
- my ($members, $csv_line, $csv_lines_rejected, $csv_lines_to_reparse) = @_;
- print STDERR ("member_of_csv_line: csv_line=".Data::Dumper::Dumper($csv_line));
- my $number = Text::Trim::trim($csv_line->{number});
- if (not $number) {
- push @$csv_lines_rejected, $csv_line;
- }
- else {
- my $member = {};
- if (not $number or not ($number =~ m/^[0-9]+$/)) {
- if (defined $csv_lines_to_reparse) {
- push @$csv_lines_to_reparse, $csv_line;
- return;
- }
- else {
- $greatest_number = $greatest_number + 1;
- print STDERR "WARNING: renumérotation: ".($number?$number:"undef")." -> $greatest_number\n";
- $csv_line->{comment}
- =($csv_line->{comment}?"$csv_line->{comment}. ":"")
- ."(n° malformé d'origine : ".($number?$number:"undef").")";
- $number = "$greatest_number";
- }
- }
- if ($number =~ m/^[0-9]+$/) {
- $number = $number + 0;
- if ($last_number + 1 != $number + 0) {
- print STDERR "WARNING: discontinuité: attendu=".($last_number + 1)." eu=".($number + 0)."\n";
- }
- $last_number = $number;
- $greatest_number = $number
- if $number > $greatest_number;
-
- if ($csv_line->{name} or $csv_line->{email}) {
- if (exists $members->{$number}) {
- $member = $members->{$number};
- }
- else {
- $member = {};
- $members->{$number} = $member;
- }
- $member->{number} = $number;
- $member->{name}
- = $csv_line->{name}
- unless $member->{name};
- $member->{firstname}
- = $csv_line->{firstname}
- unless $member->{firstname};
- $member->{email}
- = $csv_line->{email}
- unless $member->{email};
- $member->{cotisations}
- = []
- unless exists $member->{cotisations};
- push @{$member->{cotisations}},
- { amount => parse_amount($csv_line->{cotisation_amount})
- , date => parse_date($csv_line->{cotisation_date})
- , discount => parse_discount($csv_line->{cotisation_discount})
- , mean => parse_payment_mean($csv_line->{cotisation_mean})
- };
- $member->{zip}
- =($csv_line->{zip}
- ? $csv_line->{zip}
- : undef)
- unless $member->{zip};
- $member->{gender}
- =($csv_line->{gender}
- ? parse_gender($csv_line->{gender})
- : undef)
- unless $member->{gender};
- $member->{city}
- =($csv_line->{city}
- ? $csv_line->{city}
- : ($member->{zip} and ($member->{zip} =~ m/^750[0-2][0-9]$/) ? "Paris" : undef))
- unless $member->{city};
- $member->{country}
- = ($member->{zip} and ($member->{zip} =~ m/^UK$/)
- ? "Royaume-Uni"
- : "France")
- unless $member->{country};
- $member->{phone}
- =($csv_line->{landline_phone}
- ? $csv_line->{landline_phone}
- :($csv_line->{mobile_phone}
- ? $csv_line->{mobile_phone}
- : undef))
- unless $member->{phone};
- $member->{street}
- =($csv_line->{street}
- ? $csv_line->{street}
- : undef)
- unless $member->{street};
- $member->{comment}
- =($csv_line->{comment}
- ? $csv_line->{comment}
- : undef)
- unless $member->{comment};
- }
- else {
- push @$csv_lines_rejected, $csv_line;
- }
- }
- }
- }
-sub xml_of_member (@) {
- my ($xml, $member, $xml_data, $xml_data_noupdate) = @_;
- print STDERR ("xml_of_member: member=".Data::Dumper::Dumper($member));
- push @$xml_data, $xml->record
- ( { id => "res_partner_${partner}_".$member->{number}
- , model => "res.partner"
- }
- , $xml->field({name => "name"}, $member->{name} . ($member->{firstname} ? " ".$member->{firstname} : ""))
- , $xml->field({name => "member_ident"}, $member->{number})
- , $xml->field({name => "type"}, "default")
- , ($member->{zip} ? $xml->field({name => "zip"}, $member->{zip}) : ())
- , ($member->{city} ? $xml->field({name => "city"}, $member->{city}) : ())
- , ($member->{country}? $xml->field({name => "country_id", model => "res.country", search => "[('name','=','".$member->{country}."')]"}) : ())
- , ($member->{email} ? $xml->field({name => "email"}, $member->{email}) : ())
- , ($member->{phone} ? $xml->field({name => "phone"}, $member->{phone}) : ())
- , ($member->{street} ? $xml->field({name => "street"}, $member->{street}) : ())
- , ($member->{comment}? $xml->field({name => "comment"}, $member->{comment}) : ())
- );
- die unless $member->{cotisations};
- foreach my $cotisation (@{$member->{cotisations}}) {
- push @$xml_data_noupdate, $xml->function
- ( { model => "account.invoice"
- , name => "pay_and_reconcile"
- }
- , $xml->xmlcmnt('ids')
- , $xml->function
- ( { model => "account.invoice"
- , name => "draft2open"
- }
- , $xml->function
- ( { model => "res.partner"
- , name => "create_membership_invoice"
- }
- , $xml->xmlcmnt('partner_id')
- , $xml->value({eval => "ref('res_partner_${partner}_".$member->{number}."')"})
- , $xml->xmlcmnt('product_id')
- , $xml->value({eval => "ref('product_".$cotisation->{discount}."_member')"})
- , $xml->xmlcmnt('context')
- , $xml->value({eval => "{'amount':".$cotisation->{amount}.", 'date_from':'".$cotisation->{date}."'}"})
- )
- )
- , $xml->xmlcmnt('pay_amount')
- , $xml->value ({eval => "$cotisation->{amount}"})
- , $xml->xmlcmnt('pay_account_id')
- , $xml->value ({model => "account.account", search => "[('name', '=', 'Cash')]"})
- , $xml->xmlcmnt("mean: $cotisation->{mean}")
- , $xml->xmlcmnt('period_id')
- , $xml->value ({model => "account.period", search => "[('name', '=', time.strftime('%m/%Y'))]"})
- , $xml->xmlcmnt('pay_journal_id')
- , $xml->value ({model => "account.journal", search => "[('name', '=', 'Cash')]"})
- , $xml->xmlcmnt('writeoff_acc_id')
- , $xml->value ({model => "account.account", search => "[('name', '=', 'Cash')]"})
- , $xml->xmlcmnt('writeoff_period_id')
- , $xml->value ({model => "account.period", search => "[('name', '=', time.strftime('%m/%Y'))]"})
- , $xml->xmlcmnt('writeoff_journal_id')
- , $xml->value ({model => "account.journal", search => "[('name', '=', 'Cash')]"})
- , $xml->xmlcmnt('context')
- , $xml->value ({eval => "{}"})
- , $xml->xmlcmnt('name')
- , $xml->value ({eval => "str('Import de paiement automatique')"})
- );
- }
- }
-
-sub main () {
- my $csv = Text::CSV->new
- ({binary => 1
- , eol => $/
- , sep_char => ';'
- });
- my $xml = XML::Generator->new
- ( escape => 'always'
- , conformance => 'strict'
- , empty => 'self'
- , pretty => 2
- );
- my $in = IO::Wrap::wraphandle(\*STDIN);
-
- my $csv_head = $csv->getline($in);
- #print STDERR ("head: ", join("|", @$csv_head), "\n");
- #$csv->column_names(@$csv_head);
- $csv->column_names (qw (
- number
- cotisation_date
- cotisation_amount
- cotisation_mean
- cotisation_discount
- gender
- firstname
- name
- birth
- email
- landline_phone
- mobile_phone
- street
- zip
- city
- comment
- ));
- my $xml_data = [];
- my $xml_data_noupdate = [];
- my $csv_lines_rejected = [];
- my $csv_lines_to_reparse = [];
- my $members = {};
- while (my $csv_line = $csv->getline_hr($in)) {
- #print STDERR ("csv_line: ", join("|", @$csv_line), "\n");
- member_of_csv_line($members, $csv_line, $csv_lines_rejected, $csv_lines_to_reparse);
- }
- print STDERR "csv_lines_to_reparse=".Data::Dumper::Dumper($csv_lines_to_reparse);
- foreach my $csv_line (@$csv_lines_to_reparse) {
- member_of_csv_line($members, $csv_line, $csv_lines_rejected, undef);
- }
- foreach my $number (sort {$a <=> $b} (keys %$members)) {
- xml_of_member($xml, $members->{$number}, $xml_data, $xml_data_noupdate);
- }
- push @$xml_data_noupdate, $xml->record
- ( { id => "remembership.member_ident_sequence"
- , model => "ir.sequence"
- }
- , $xml->field({name => "number_next"}, $greatest_number + 1)
- );
- binmode STDOUT, ':utf8';
- print $xml->openerp
- ( $xml->data(@$xml_data)
- , $xml->data
- ( {noupdate => "1"}
- , @$xml_data_noupdate )
- );
-
- my $out = IO::Wrap::wraphandle(\*STDERR);
- print STDERR "csv_lines_rejected=".Data::Dumper::Dumper($csv_lines_rejected);
- }
-
-main;
+++ /dev/null
-../sec/data/members.xml
\ No newline at end of file
+++ /dev/null
-<openerp>
- <data>
- <record id="product_standard_member" model="product.product">
- <field name="name">Standard member</field>
- <field name="list_price">25.00</field>
- <field name="standard_price">0.00</field>
- <field name="uom_id" ref="product.product_uom_unit"/>
- <field name="uom_po_id" ref="product.product_uom_unit"/>
- <field name="type">service</field>
- <field name="categ_id" ref="product_category_other"/>
- <field name="supply_method">produce</field>
- <field name="membership">True</field>
- <field name="membership_date2date">True</field>
- </record>
- <record id="product_student_member" model="product.product">
- <field name="name">Student member</field>
- <field name="list_price">15.00</field>
- <field name="standard_price">0.00</field>
- <field name="uom_id" ref="product.product_uom_unit"/>
- <field name="uom_po_id" ref="product.product_uom_unit"/>
- <field name="type">service</field>
- <field name="categ_id" ref="product_category_other"/>
- <field name="supply_method">produce</field>
- <field name="membership">True</field>
- <field name="membership_date2date">True</field>
- </record>
- <record id="product_unemployed_member" model="product.product">
- <field name="name">Unemployed member</field>
- <field name="list_price">15.00</field>
- <field name="standard_price">0.00</field>
- <field name="uom_id" ref="product.product_uom_unit"/>
- <field name="uom_po_id" ref="product.product_uom_unit"/>
- <field name="type">service</field>
- <field name="categ_id" ref="product_category_other"/>
- <field name="supply_method">produce</field>
- <field name="membership">True</field>
- <field name="membership_date2date">True</field>
- </record>
- <record id="product_retired_member" model="product.product">
- <field name="name">Retired member</field>
- <field name="list_price">15.00</field>
- <field name="standard_price">0.00</field>
- <field name="uom_id" ref="product.product_uom_unit"/>
- <field name="uom_po_id" ref="product.product_uom_unit"/>
- <field name="type">service</field>
- <field name="categ_id" ref="product_category_other"/>
- <field name="supply_method">produce</field>
- <field name="membership">True</field>
- <field name="membership_date2date">True</field>
- </record>
- <record id="product_velorution_idf_member" model="product.product">
- <field name="name">Vélorution ÎdF member</field>
- <field name="list_price">15.00</field>
- <field name="standard_price">0.00</field>
- <field name="uom_id" ref="product.product_uom_unit"/>
- <field name="uom_po_id" ref="product.product_uom_unit"/>
- <field name="type">service</field>
- <field name="categ_id" ref="product_category_other"/>
- <field name="supply_method">produce</field>
- <field name="membership">True</field>
- <field name="membership_date2date">True</field>
- </record>
- </data>
- </openerp>
+++ /dev/null
-<openerp>
- <data>
- <record id="res_partner_category_organisation" model="res.partner.category">
- <field name="name">Organisation</field>
- </record>
- <record id="res_partner_category_company" model="res.partner.category">
- <field name="name">Company</field>
- </record>
- <record id="res_partner_category_association" model="res.partner.category">
- <field name="name">Association</field>
- <field name="parent_id" ref="res_partner_category_organisation"/>
- </record>
- <record id="res_partner_category_bike_workshop" model="res.partner.category">
- <field name="name">Bike workshop</field>
- <field name="parent_id" ref="res_partner_category_association"/>
- </record>
- <record id="res_partner_category_member" model="res.partner.category">
- <field name="name">Member</field>
- </record>
- </data>
- </openerp>
+++ /dev/null
-<openerp>
- <data>
- <record id="product_category_other" model="product.category">
- <field name="name">Others</field>
- </record>
- </data>
- </openerp>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<openerp>
+ <data>
+ <record id="product_category_RAC" model="product.category">
+ <field name="parent_id" ref="product.product_category_all"/>
+ <field model="account.account" name="property_account_expense_categ" search="[('code', '=', '607100')]"/>
+ <field model="account.account" name="property_account_income_categ" search="[('code', '=', '707100')]"/>
+ <field name="name">Tous</field>
+ </record>
+ <record id="product_category_COT" model="product.category">
+ <field name="parent_id" ref="product_category_RAC"/>
+ <field model="account.account" name="property_account_income_categ" search="[('code', '=', '756000')]"/>
+ <field name="name">Cotisations</field>
+ </record>
+ <record id="product_category_ANI" model="product.category">
+ <field name="parent_id" ref="product_category_RAC"/>
+ <field model="account.account" name="property_account_income_categ" search="[('code', '=', '706000')]"/>
+ <field name="name">Animations</field>
+ </record>
+ </data>
+</openerp>
+
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<openerp>
+ <data>
+ <record id="product_product_AP" model="product.product">
+ <field name="list_price">1.0</field>
+ <field name="name">Autre produit</field>
+ <field name="type">service</field>
+ <field name="default_code">AP</field>
+ <field eval="False" name="purchase_ok"/>
+ <field name="categ_id" ref="product_category_RAC"/>
+ <field eval="False" name="sale_ok"/>
+ </record>
+ <record id="product_product_CI" model="product.product">
+ <field name="supply_method">produce</field>
+ <field eval="True" name="membership_date2date"/>
+ <field name="list_price">15.0</field>
+ <field name="name">Cotisation individuelle</field>
+ <field name="categ_id" ref="product_category_COT"/>
+ <field name="standard_price">0.0</field>
+ <field eval="True" name="membership"/>
+ <field name="default_code">CI</field>
+ <field eval="False" name="purchase_ok"/>
+ <field name="type">service</field>
+ <field eval="True" name="sale_ok"/>
+ </record>
+ <record id="product_product_CF" model="product.product">
+ <field name="supply_method">produce</field>
+ <field eval="True" name="membership_date2date"/>
+ <field name="list_price">35.0</field>
+ <field name="name">Cotisation familliale</field>
+ <field name="categ_id" ref="product_category_COT"/>
+ <field name="standard_price">0.0</field>
+ <field eval="True" name="membership_grouped"/>
+ <field eval="True" name="membership"/>
+ <field name="default_code">CF</field>
+ <field eval="False" name="purchase_ok"/>
+ <field name="type">service</field>
+ <field eval="True" name="sale_ok"/>
+ </record>
+ <record id="product_product_ATM" model="product.product">
+ <field name="supply_method">produce</field>
+ <field name="list_price">1.0</field>
+ <field name="name">Atelier d’auto-réparation</field>
+ <field name="type">service</field>
+ <field name="default_code">ATM</field>
+ <field eval="False" name="purchase_ok"/>
+ <field name="categ_id" ref="product_category_ANI"/>
+ <field eval="True" name="sale_ok"/>
+ </record>
+ <record id="product_product_FOR" model="product.product">
+ <field name="supply_method">produce</field>
+ <field name="list_price">1.0</field>
+ <field name="name">Formations</field>
+ <field name="type">service</field>
+ <field name="default_code">FOR</field>
+ <field eval="False" name="purchase_ok"/>
+ <field name="categ_id" ref="product_category_ANI"/>
+ <field eval="True" name="sale_ok"/>
+ </record>
+ </data>
+</openerp>
+
<openerp>
- <data>
- <record id="view_bikecoop_members_form" model="ir.ui.view">
- <field name="name">res.partner.form</field>
- <field name="model">res.partner</field>
- <field name="inherit_id" ref="bikecoop.view_bikecoop_members_form"/>
- <field name="arch" type="xml">
- <xpath expr="//field[@name='gender_id']" position="replace">
- <field name="gender_id" domain="[('domain','=', 'gender')]" placeholder="Other, Female or Male" attrs="{'required':False}"/>
- </xpath>
- <xpath expr="//field[@name='occupation_id']" position="replace">
- <field name="occupation_id" placeholder="Student/Employee/Other" domain="[('domain','=', 'occupation')]" attrs="{'required':False}"/>
- </xpath>
- </field>
- </record>
- </data>
- </openerp>
+ <data>
+ <record id="view_bikecooop_members_form" model="ir.ui.view">
+ <field name="name">res.partner.form</field>
+ <field name="model">res.partner</field>
+ <field name="inherit_id" ref="bikecoop.view_bikecoop_members_form"/>
+ <field name="arch" type="xml">
+ <xpath expr="//field[@name='zip']" position="attributes">
+ <attribute name="required">1</attribute>
+ </xpath>
+ <xpath expr="//field[@name='nationality_id']" position="replace">
+ <field name="nationality_id" placeholder="France" attrs="{'required': 0}"/>
+ </xpath>
+ <xpath expr="//field[@name='occupation_id']" position="replace"/>
+ <xpath expr="//notebook[@name='Volunteer activities']" position="replace"/>
+ </field>
+ </record>
+ </data>
+</openerp>